package top.wuchu.rpc.hook;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.wuchu.rpc.factory.ThreadPoolFactory;
import top.wuchu.rpc.util.NacosUtil;

/**
 * 当服务挂了的时候，此shutdownHook就会执行去清除注册中心的服务信息
 * @author Wuchu
 */
public class ShutdownHook {

    private static final Logger logger = LoggerFactory.getLogger(ShutdownHook.class);

    private static final ShutdownHook shutdownHook = new ShutdownHook();

    public static ShutdownHook getShutdownHook() {
        return shutdownHook;
    }

    public void addClearAllHook() {
        logger.info("关闭后将自动注销所有服务");
        // Runtime.getRuntime().addShutdownHook(Thread hook);
        // 这个方法就是说：当前程序如果正常退出、使用System.exit()、使用Ctrl+c、Kill命令让当前服务挂掉
        // 这个hoot线程就会执行，一般你想想，服务挂了，注册中心肯定不能存在当前服务的信息，所以，一般使用这个方法来
        // 清除注册中心的信息和关闭线程池来节约资源
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            NacosUtil.clearRegistry();
            ThreadPoolFactory.shutDownAll();
        }));
    }

}
